package com.jplus.service.impl;

import com.jplus.VO.ResultVO;
import com.jplus.dao.RegisterVarDao;
import com.jplus.dao.UserDao;
import com.jplus.entity.User;
import com.jplus.enums.ResultEnum;
import com.jplus.exception.SFUmbrellaException;
import com.jplus.listener.MySessionContext;
import com.jplus.service.RegisterService;
import com.jplus.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.json.HTTP;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;


@Service
@Slf4j
@Transactional
public class RegisterServiceImpl implements RegisterService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private RegisterVarDao registerVarDao;

    @Override
    public ResultVO register(HttpServletRequest request, User user) {
        int registerCount = 0;
        try {
            // 从数据库取出验证码发送次数
            registerCount = registerVarDao.getRegisterCountByPhone(user.getPhone());
        } catch (Exception e) {
            e.printStackTrace();
            if (registerCount == 0) {
                log.info("第一次从数据库取出验证码发送次数，报异常是正常的。");
            } else {
                log.info("数据库取出验证码发送次数异常！");
            }
        }
        // 先判断是否发送过验证码
        if (registerCount == 0) {
            // 先检查数据库里面是否存在相同的手机号码
            User alreadyHasAUser = userDao.getUserByPhone(user.getPhone());
            if (alreadyHasAUser == null) {
                //数据库中不存在该手机号码，可以注册
                try {
                    String authCode = AuthCodeUtils.makeAuthCode();
                    user.setAuthCode(authCode);
                    String businessId = UUIDUtils.getUUID();
                    user.setBusinessId(businessId);
                    user.setStatus(0);
                    user.setAdmin(0);
                    user.setRegisterTime(new Date());
                    user.setRegisterIp(IpUtils.getIpAdrress(request));
                    userDao.insertOneUser(user);
                    SendAuthCodeUtils.send(user.getPhone(), authCode);
                    registerCount++;
                    // 第一次发送验证码之后，就把验证码发送次数写到数据库里面，以便下一次读取
                    registerVarDao.setRegisterCount(registerCount, user.getPhone());
                    // 设置定时器
                    RegisterTimer registerTimer = new RegisterTimer(userDao, registerVarDao, user);
                    registerTimer.start();
                    log.info("用户：{}正在注册，时间：{}", user.getPhone(), new Date());
                    return ResultVOUtils.success(user);
                } catch (Exception e) {
                    log.error("用户：{}注册失败，时间：{}", user.getPhone(), new Date());
                    throw new SFUmbrellaException(ResultEnum.REGISTER_FAIL);
                }
            } else {
                // 否则说明数据库里面存在此用户，再看看此用户是否激活，若已激活，不允许注册，否则可以注册
                if (alreadyHasAUser.getStatus().equals(1)) {
                    log.error("用户名：{}已经存在，不可以使用", user.getPhone());
                    return ResultVOUtils.error(0, "该手机号码已被注册", "注册失败");
                } else {
                    // 没有被激活表示新用户正在注册，可以接收密码，更新status
                    alreadyHasAUser.setPassword(user.getPassword());
                    alreadyHasAUser.setStatus(1);
                    try {
                        userDao.updateOneUserById(alreadyHasAUser);
                    } catch (Exception e) {
                        throw new SFUmbrellaException(ResultEnum.REGISTER_FAIL);
                    }
                    return ResultVOUtils.success(alreadyHasAUser);
                }
            }
        } else if (registerCount == 4) {
            // TODO 禁止注册1小时
            log.info("禁止注册一小时");
            return ResultVOUtils.success("你尝试获取验证码的次数超过4次，禁止注册一小时");
        } else {
            // 2~5次注册期间 再次更新发送验证码即可 并计数
            User u = userDao.getUserByPhone(user.getPhone());
            u.setAuthCode(AuthCodeUtils.makeAuthCode());
            userDao.updateAuthCodeByBusinessId(u);
            // 再发送短信
            SendAuthCodeUtils.send(u.getPhone(), u.getAuthCode());
            registerCount++;
            registerVarDao.updateRegisterCount(registerCount, user.getPhone());
            log.info("再次发送验证码");
            return ResultVOUtils.success(u);
        }
    }

    @Override
    public ResultVO checkRegister(User user) {
        User u = userDao.getUserByPhone(user.getPhone());
        if (u.getAuthCode().equals(user.getAuthCode())) {
            log.info("注册成功");
            u.setStatus(0);
            // 移除验证码、计数器、计时器。
            u.setAuthCode(null);
            userDao.updateAuthCodeByBusinessId(u);
            registerVarDao.deleteRegisterCount(user.getPhone());
            return ResultVOUtils.success(u);
        } else {
            log.info("注册失败");
            /*
             * 删除数据库记录
             * 这里不因该是验证码输入错误删除手机号码，而是其他情况
             */
            return ResultVOUtils.error(0, "验证码输入错误");
        }
    }
}
